<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>日志设置 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'logging.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/logging.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/logging.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/logging.html" rel="nofollow" target="_blank">../en/logging.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="setup.html">安装和设置</a></span>
»
<span class="breadcrumb-link"><a href="settings.html">配置 Elasticsearch</a></span>
»
<span class="breadcrumb-node">日志设置</span>
</div>
<div class="navheader">
<span class="prev">
<a href="modules-gateway.html">« 本地网关设置</a>
</span>
<span class="next">
<a href="ml-settings.html">Elasticsearch中的机器学习设置 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="logging"></a>日志设置 (logging configuration)
</h2>
</div></div></div>
<p>
Elasticsearch 使用 <a href="https://logging.apache.org/log4j/2.x/" class="ulink" target="_top">Log4j 2</a> 进行日志记录。
Log4j 2 可以使用 log4j2.properties 文件进行配置。
Elasticsearch公开了三个属性，<code class="literal">${sys:es.logs.base_path}</code>、<code class="literal">${sys:es.logs.cluster_name}</code> 以及  <code class="literal">${sys:es.logs.node_name}</code>，可以在配置文件中引用这些属性来确定日志文件的位置。

属性 <code class="literal">${sys:es.logs.base_path}</code> 将解析为日志目录，<code class="literal">${sys:es.logs.cluster_name}</code> 将解析为集群名称(在默认配置中用作日志文件名的前缀)，而<code class="literal">${sys:es.logs.node_name}</code>将解析为节点名称(如果明确设置了节点名称)。
</p>
<p>
比如，如果日志目录(<code class="literal">path.logs</code>)是<code class="literal">/var/log/elasticsearch</code>，集群名称是<code class="literal">production</code>，那么<code class="literal">${sys:es.logs.base_path}</code>就会解析为<code class="literal">/var/log/elasticsearch</code>，<code class="literal">${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log</code> 将解析为<code class="literal">/var/log/elasticsearch/production.log</code>。
</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">######## Server JSON ############################
appender.rolling.type = RollingFile <a id="CO9-1"></a><i class="conum" data-value="1"></i>
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.json <a id="CO9-2"></a><i class="conum" data-value="2"></i>
appender.rolling.layout.type = ESJsonLayout <a id="CO9-3"></a><i class="conum" data-value="3"></i>
appender.rolling.layout.type_name = server <a id="CO9-4"></a><i class="conum" data-value="4"></i>
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.json.gz <a id="CO9-5"></a><i class="conum" data-value="5"></i>
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy <a id="CO9-6"></a><i class="conum" data-value="6"></i>
appender.rolling.policies.time.interval = 1 <a id="CO9-7"></a><i class="conum" data-value="7"></i>
appender.rolling.policies.time.modulate = true <a id="CO9-8"></a><i class="conum" data-value="8"></i>
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy <a id="CO9-9"></a><i class="conum" data-value="9"></i>
appender.rolling.policies.size.size = 256MB <a id="CO9-10"></a><i class="conum" data-value="10"></i>
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.fileIndex = nomax
appender.rolling.strategy.action.type = Delete <a id="CO9-11"></a><i class="conum" data-value="11"></i>
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path}
appender.rolling.strategy.action.condition.type = IfFileName <a id="CO9-12"></a><i class="conum" data-value="12"></i>
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* <a id="CO9-13"></a><i class="conum" data-value="13"></i>
appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize <a id="CO9-14"></a><i class="conum" data-value="14"></i>
appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB <a id="CO9-15"></a><i class="conum" data-value="15"></i>
################################################</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>配置 <code class="literal">RollingFile</code> 附加器</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>日志记录到 <code class="literal">/var/log/elasticsearch/production_server.json</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>使用 JSON 布局</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">type_name</code>是一个标志，用于填充<code class="literal">ESJsonLayout</code>中的<code class="literal">type</code>字段。
在解析日志时，它可以用来更容易地区分不同类型的日志。
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-5"><i class="conum" data-value="5"></i></a></p>
</td>
<td align="left" valign="top">
<p>滚动(roll)日志到 <code class="literal">/var/log/elasticsearch/production-yyyy-MM-dd-i.json</code>；
日志将在每个滚动上被压缩，<code class="literal">i</code>将递增
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-6"><i class="conum" data-value="6"></i></a></p>
</td>
<td align="left" valign="top">
<p>使用一个基于时间的滚动策略</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-7"><i class="conum" data-value="7"></i></a></p>
</td>
<td align="left" valign="top">
<p>以天为基础<span class="remark">(每天)</span>滚动日志</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-8"><i class="conum" data-value="8"></i></a></p>
</td>
<td align="left" valign="top">
<p>在一天的边界上对齐滚动(而不是每24小时滚动一次)</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-9"><i class="conum" data-value="9"></i></a></p>
</td>
<td align="left" valign="top">
<p>使用基于大小的滚动策略</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-10"><i class="conum" data-value="10"></i></a></p>
</td>
<td align="left" valign="top">
<p>日志达到 256 MB 时滚动</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-11"><i class="conum" data-value="11"></i></a></p>
</td>
<td align="left" valign="top">
<p>滚动日志时使用删除操作</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-12"><i class="conum" data-value="12"></i></a></p>
</td>
<td align="left" valign="top">
<p>仅删除与文件模式匹配的日志</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-13"><i class="conum" data-value="13"></i></a></p>
</td>
<td align="left" valign="top">
<p>模式是只删除主日志</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-14"><i class="conum" data-value="14"></i></a></p>
</td>
<td align="left" valign="top">
<p>只有当我们积累了太多的压缩日志时才删除</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO9-15"><i class="conum" data-value="15"></i></a></p>
</td>
<td align="left" valign="top">
<p>压缩日志的大小条件是2 GB</p>
</td>
</tr>
</table>
</div>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">######## Server -  old style pattern ###########
appender.rolling_old.type = RollingFile
appender.rolling_old.name = rolling_old
appender.rolling_old.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log <a id="CO10-1"></a><i class="conum" data-value="1"></i>
appender.rolling_old.layout.type = PatternLayout
appender.rolling_old.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %m%n
appender.rolling_old.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.old_log.gz</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO10-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">old style</code>模式附加器的配置。这些日志将被保存在 <code class="literal">*.log</code> 文件中，如果存档，将被保存在 <code class="literal">*.log.gz</code> 文件中。请注意，这些应该被认为是过时的，将来会被删除。</p>
</td>
</tr>
</table>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Log4j 的配置解析会被任何无关的 空白(whitespace) 混淆；如果你在这个页面上复制和粘贴任何 Log4j 设置，或者输入任何 Log4j 配置，一定要移除(trim)任何前后空白。</p>
</div>
</div>
<p>注意，你可以在<code class="literal">appender.rolling.filePattern</code>中使用<code class="literal">.zip</code>取代<code class="literal">.gz</code>，以使用 zip 格式压缩滚动的日志。如果你把<code class="literal">.gz</code>扩展名移除，则日志在滚动时不会被压缩。</p>
<p>如果要将日志文件保留指定的一段时间，可以使用带有删除操作的滚动策略。</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">appender.rolling.strategy.type = DefaultRolloverStrategy <a id="CO11-1"></a><i class="conum" data-value="1"></i>
appender.rolling.strategy.action.type = Delete <a id="CO11-2"></a><i class="conum" data-value="2"></i>
appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} <a id="CO11-3"></a><i class="conum" data-value="3"></i>
appender.rolling.strategy.action.condition.type = IfFileName <a id="CO11-4"></a><i class="conum" data-value="4"></i>
appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* <a id="CO11-5"></a><i class="conum" data-value="5"></i>
appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified <a id="CO11-6"></a><i class="conum" data-value="6"></i>
appender.rolling.strategy.action.condition.nested_condition.age = 7D <a id="CO11-7"></a><i class="conum" data-value="7"></i></pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>配置 <code class="literal">DefaultRolloverStrategy</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>配置用于处理滚动的 <code class="literal">Delete</code> 操作</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>Elasticsearch 日志的基本路径</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-4"><i class="conum" data-value="4"></i></a></p>
</td>
<td align="left" valign="top">
<p>应用滚动处理时的条件</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-5"><i class="conum" data-value="5"></i></a></p>
</td>
<td align="left" valign="top">
<p>
从与<code class="literal">${sys:es.logs.cluster_name}-*</code> 通配符(glob) 匹配的基本路径中删除文件；这是日志文件滚动到的 通配符(glob)；
这仅需要删除滚动的 Elasticsearch 日志，但不需要删除启用的和慢日志
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-6"><i class="conum" data-value="6"></i></a></p>
</td>
<td align="left" valign="top">
<p>应用于与通配符匹配的文件的嵌套条件 <span class="remark">(A nested condition to apply to files matching the glob)</span></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO11-7"><i class="conum" data-value="7"></i></a></p>
</td>
<td align="left" valign="top">
<p>日志保留 7 天</p>
</td>
</tr>
</table>
</div>
<p>
只要将多个配置文件命名为<code class="literal">log4j2.properties</code>，就可以加载多个配置文件(在这种情况下它们将被合并)，并将 Elasticsearch 配置目录作为根目录；这对公开附加日志的插件很有用。

日志(logger) 部分包含 java 包及相对应的日志级别。

附加器(appender) 部分包含日志的目的地。  

关于如何定制日志记录和所有支持的附加器的详细信息可以在<a href="http://logging.apache.org/log4j/2.x/manual/configuration.html" class="ulink" target="_top">Log4j 文档</a>中找到。
</p>
<h3>
<a id="configuring-logging-levels"></a>
配置日志级别 (configuring logging levels)

</h3>
<p>有四种配置日志级别的方法，每种方法都有与之相对应的使用场景。</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
通过命令行： <code class="literal">-E &lt;name of logging hierarchy&gt;=&lt;level&gt;</code> (比如，
<code class="literal">-E logger.org.elasticsearch.discovery=debug</code>).
当你临时调试单个节点上的问题(例如，启动或开发过程中的问题)时，这是最合适的。
</li>
<li class="listitem">
通过 <code class="literal">elasticsearch.yml</code>: <code class="literal">&lt;name of logging hierarchy&gt;: &lt;level&gt;</code> (比如，
<code class="literal">logger.org.elasticsearch.discovery: debug</code>).
当你临时调试一个问题，但没有通过命令行（例如，通过服务）启动 Elasticsearch 时，或者你希望在更持久的基础上调整日志级别时，这是最合适的。
</li>
<li class="listitem">
<p>通过 <a class="xref" href="modules-cluster.html#cluster-logger" title="Logger">集群设置</a>:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /_cluster/settings
{
  "transient": {
    "&lt;name of logging hierarchy&gt;": "&lt;level&gt;"
  }
}</pre>
</div>
<p>比如：</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /_cluster/settings
{
  "transient": {
    "logger.org.elasticsearch.discovery": "DEBUG"
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/27.console"></div>
<p>当你需要动态地调整正在运行的集群上的日志级别时，这是最合适的。</p>
</li>
<li class="listitem">
<p>通过 <code class="literal">log4j2.properties</code>:</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">logger.&lt;unique_identifier&gt;.name = &lt;name of logging hierarchy&gt;
logger.&lt;unique_identifier&gt;.level = &lt;level&gt;</pre>
</div>
<p>比如：</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">logger.discovery.name = org.elasticsearch.discovery
logger.discovery.level = debug</pre>
</div>
<p>当你需要对日志进行细粒度控制时，这是最合适的(例如，你想要将日志发送到另一个文件，或者以不同的方式管理日志；这是一个罕见的用例)。</p>
</li>
</ol>
</div>
<h3>
<a id="deprecation-logging"></a>弃用日志 (deprecation logging)
</h3>
<p>
除了常规日志之外，Elasticsearch 还允许你开启记录 弃用的操作(deprecated action) 的日志。
例如，这允许你尽早确定将来是否需要迁移某些功能。
默认情况下，在 <code class="literal">WARN</code> 级别启用弃用日志记录，在该级别会发出所有弃用日志消息。
</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">logger.deprecation.level = warn</pre>
</div>
<p>这将在日志目录中创建一个每日滚动的弃用日志文件。请定期检查该文件，尤其是当你打算升级到新的主要版本时。</p>
<p>默认的日志记录配置已将弃用日志的滚动策略设置为在 1 GB 后滚动和压缩，并最多保留五个日志文件(四个滚动日志和一个活动的日志)。</p>
<p>你可以在<code class="literal">config/log4j2.properties</code> 文件中禁用它，方法是将弃用日志级别设置为<code class="literal">error</code>，如下所示:</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">logger.deprecation.name = org.elasticsearch.deprecation
logger.deprecation.level = error</pre>
</div>
<p>如果<code class="literal">X-Opaque-Id</code>被用作 HTTP 头，你可以确定是什么触发了弃用的功能。用户 ID 包含在弃用 JSON 日志的<code class="literal">X-Opaque-ID</code>字段中。</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">{
  "type": "deprecation",
  "timestamp": "2019-08-30T12:07:07,126+02:00",
  "level": "WARN",
  "component": "o.e.d.r.a.a.i.RestCreateIndexAction",
  "cluster.name": "distribution_run",
  "node.name": "node-0",
  "message": "[types removal] Using include_type_name in create index requests is deprecated. The parameter will be removed in the next major version.",
  "x-opaque-id": "MY_USER_ID",
  "cluster.uuid": "Aq-c-PAeQiK3tfBYtig9Bw",
  "node.id": "D7fUYfnfTLa2D7y-xw6tZg"
}</pre>
</div>
<h3>
<a id="json-logging"></a>JSON 日志格式
</h3>
<p>
为了更容易解析 Elasticsearch 日志，日志现在已经以 JSON 格式打印。
这是由 Log4J 布局属性<code class="literal">appender.rolling.layout.type = ESJsonLayout</code>配置的。
此布局要求设置<code class="literal">type_name</code>属性，该属性用于在解析时区分日志流。</p>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">appender.rolling.layout.type = ESJsonLayout
appender.rolling.layout.type_name = server</pre>
</div>
<p>
每行包含一个 JSON 文档，其属性在 <code class="literal">ESJsonLayout</code> 中配置。
有关更多详细信息，请参见此类<a href="https://artifacts.elastic.co/javadoc/org/elasticsearch/elasticsearch/7.7.1/org/elasticsearch/common/logging/ESJsonLayout.html" class="ulink" target="_top">javadoc</a>。
然而，如果一个 JSON 文档包含一个异常，它将被打印成多行。
第一行将包含常规属性，随后的行将包含格式化为 JSON 数组的栈跟踪信息。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
你仍然可以使用自己的自定义布局。
为此，请用不同的布局替换<code class="literal">appender.rolling.layout.type</code>行。参见下面的示例：
</div>
</div>
<div class="pre_wrapper lang-properties">
<pre class="programlisting prettyprint lang-properties">appender.rolling.type = RollingFile
appender.rolling.name = rolling
appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_server.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] [%node_name]%marker %.-10000m%n
appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz</pre>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="modules-gateway.html">« 本地网关设置</a>
</span>
<span class="next">
<a href="ml-settings.html">Elasticsearch中的机器学习设置 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>